<?php
class image{
	public $src_file	= "";
	public $dst_file	= "";
	public $src_dir		= "";
	public $dst_dir		= "";
	public $src_full	= "";
	public $dst_full	= "";
	public $src_type	= "";
//	public $dst_type	= "";
	public $src_width	= 0;
	public $src_height	= 0;
	public $dst_width	= 0;
	public $dst_height	= 0;
	public $src_x		= 0;
	public $src_y		= 0;
	public $dst_x		= 0;
	public $dst_y		= 0;
	
	protected $src_img;
	protected $dst_img;
	
	private $app;
	
	public function __construct(){
		global $app;
		$this->app =& $app;
		$app->{"image"} =& $this;
	}
	
	/**
	* 設定路徑檔名
	*
	* @param	string $in_src_dir		輸入檔路徑
	* @param	string $in_src_file		輸入檔名
	* @param	string $in_dst_dir		輸出檔路徑
	* @param	string $in_dst_file		輸出檔名(若不只定檔名，則會自動使用「輸入檔名_md5(時間)」為輸出檔名)
	* @return	bool
	*/
	private function set_data_path($in_src_dir, $in_src_file, $in_dst_dir, $in_dst_file){
		if(!isset($in_dst_file) || $in_dst_file == "" || $in_dst_file == NULL){
			$in_dst_file = $in_src_file."_".md5(time());
		}
		
		$this->src_file		= $in_src_file;
		$this->dst_file		= $in_dst_file;
		$this->src_dir		= $in_src_dir;
		$this->dst_dir		= $in_dst_dir;
		$this->src_full		= $this->src_dir.$this->src_file;
		$this->dst_full		= $this->dst_dir.$this->dst_file;
		
		return TRUE;
	}
	
	/**
	* 影像處理核心函式
	*
	* @param	bool $do_crop	此值TRUE時函式會進行裁剪，FALSE時函式會進行縮放
	* @return	bool
	*/
	private function do_image($do_crop = FALSE){
		// 建立目標圖檔
		$this->dst_img = ImageCreateTrueColor($this->dst_width, $this->dst_height);
		$bg_color = ImageColorAllocateAlpha($this->dst_img , 0 , 0 , 0 , 127);
		ImageFill($this->dst_img , 0 , 0 , $bg_color);
		ImageSaveAlpha($this->dst_img , TRUE);
		
		// 讀取圖檔
		switch ($this->src_type) {
			case "image/gif":
				$this->src_img = ImageCreateFromGif($this->src_full);
				break;
			case "image/jpeg":
				$this->src_img = ImageCreateFromJpeg($this->src_full);
				break;
			case "image/png":
				$this->src_img = ImageCreateFromPng($this->src_full);
				break;
//			BMP支援出錯，先移除
//			case "image/bmp":
//				$this->src_img = ImageCreateFromWbmp($this->src_full);
//				break;
			default:
				app_die("不支援的格式: ".$this->src_type);
				return FALSE;
				break;
		}
		
		if ($do_crop){
			ImageCopyResampled($this->dst_img, $this->src_img, 0, 0, $this->dst_x, $this->dst_y, $this->dst_width, $this->dst_height, $this->dst_width, $this->dst_height);
		}else{
			ImageCopyResampled($this->dst_img, $this->src_img, 0, 0, 0, 0, $this->dst_width, $this->dst_height, $this->src_width, $this->src_height);
		}
		
		// 輸出圖檔
		switch ($this->src_type) {
			case "image/gif":
				ImageGif($this->dst_img, $this->dst_full);
				break;
			case "image/jpeg":
				ImageJpeg($this->dst_img, $this->dst_full, 100);
				break;
			case "image/png":
				ImagePng($this->dst_img, $this->dst_full);
				break;
//			BMP支援出錯，先移除
//			case "image/bmp":
//				ImageWbmp($this->dst_img, $this->dst_full);
//				break;
			default:
				app_die("不支援的格式: ".$this->src_type);
				return FALSE;
				break;
		}
			
		ImageDestroy($this->src_img);
		ImageDestroy($this->dst_img);
		return TRUE;
	}
	
	/**
	* 縮放圖片
	*
	* @param	string $in_src_dir		輸入檔路徑
	* @param	string $in_src_file		輸入檔名
	* @param	string $in_dst_dir		輸出檔路徑
	* @param	string $in_dst_file		輸出檔名(若不只定檔名，則會自動使用「輸入檔名_md5(時間)」為輸出檔名)
	* @param	string $in_dst_width	輸出寬度(此值必須大於0，注意放太大記憶體會不足)
	* @param	string $in_dst_height	輸出高度(此值必須大於0，注意放太大記憶體會不足)
	* @return	bool
	*/
	public function resize($in_src_dir, $in_src_file, $in_dst_dir, $in_dst_file, $in_dst_width, $in_dst_height){
		$in_src_dir = APP_PATH.$in_src_dir;
		$in_dst_dir = APP_PATH.$in_dst_dir;
		if (file_exists($in_src_dir.$in_src_file)) {
			// 檔案存在，開始Resize
			$this->set_data_path($in_src_dir, $in_src_file, $in_dst_dir, $in_dst_file);
			
			$this->dst_width	= $in_dst_width;
			$this->dst_height	= $in_dst_height;
			
			// 取得圖檔大小、類型
			$src_size   = getImageSize($this->src_full);
			
			$this->src_width	= $src_size[0];
			$this->src_height	= $src_size[1];
			$this->src_type		= $src_size["mime"];
			
			if ($this->dst_width > 0 && $this->dst_height > 0){
				$this->do_image(FALSE);
				return TRUE;
			}else{
				return FALSE;
			}
		}else{
			ImageDestroy($this->src_img);
			ImageDestroy($this->dst_img);
			app_die("來源檔案不存在？");
			return FALSE;
		}
	}
	
	/**
	* 等比例縮放圖片
	*
	* @param	string $in_src_dir		輸入檔路徑
	* @param	string $in_src_file		輸入檔名
	* @param	string $in_dst_dir		輸出檔路徑
	* @param	string $in_dst_file		輸出檔名(若不只定檔名，則會自動使用「輸入檔名_md5(時間)」為輸出檔名)
	* @param	string $in_dst_prop		輸出比例(1是原始比例，>1是放大圖片，<1是縮小圖片。此值必須大於0，注意放太大記憶體會不足)
	* @return	bool
	*/
	public function resize_prop($in_src_dir, $in_src_file, $in_dst_dir, $in_dst_file, $in_dst_prop){
		$in_src_dir = APP_PATH.$in_src_dir;
		$in_dst_dir = APP_PATH.$in_dst_dir;
		if (file_exists($in_src_dir.$in_src_file)) {
			// 檔案存在，開始Resize
			$this->set_data_path($in_src_dir, $in_src_file, $in_dst_dir, $in_dst_file);
			
			// 取得圖檔大小、類型
			$src_size   = getImageSize($this->src_full);
			
			$this->src_width	= $src_size[0];
			$this->src_height	= $src_size[1];
			$this->src_type		= $src_size["mime"];
			$this->dst_width	= ($this->src_width * $in_dst_prop);
			$this->dst_height	= ($this->src_height * $in_dst_prop);
			
			if ($this->dst_width > 0 && $this->dst_height > 0){
				$this->do_image(FALSE);
				return TRUE;
			}else{
				return FALSE;
			}
		}else{
			ImageDestroy($this->src_img);
			ImageDestroy($this->dst_img);
			app_die("來源檔案不存在？");
			return FALSE;
		}
	}
	
	/**
	* 裁剪圖片
	*
	* @param	string $in_src_dir		輸入檔路徑
	* @param	string $in_src_file		輸入檔名
	* @param	string $in_dst_dir		輸出檔路徑
	* @param	string $in_dst_file		輸出檔名(若不只定檔名，則會自動使用「輸入檔名_md5(時間)」為輸出檔名)
	* @param	string $in_dst_x		輸出圖，在原圖上的起點X座標(此值必須大於0)
	* @param	string $in_dst_y		輸出圖，在原圖上的起點Y座標(此值必須大於0)
	* @param	string $in_dst_width	輸出圖，在原圖上的相對寬度(此值必須大於0)
	* @param	string $in_dst_height	輸出圖，在原圖上的相對高度(此值必須大於0)
	* @return	bool
	*/
	public function crop($in_src_dir, $in_src_file, $in_dst_dir, $in_dst_file, $in_dst_x, $in_dst_y, $in_dst_width, $in_dst_height){
		$in_src_dir = APP_PATH.$in_src_dir;
		$in_dst_dir = APP_PATH.$in_dst_dir;
		if (file_exists($in_src_dir.$in_src_file)) {
			// 檔案存在，開始Crop
			$this->set_data_path($in_src_dir, $in_src_file, $in_dst_dir, $in_dst_file);
			
			$this->dst_x		= $in_dst_x;
			$this->dst_y		= $in_dst_y;
			$this->dst_width	= $in_dst_width;
			$this->dst_height	= $in_dst_height;
			
			// 取得圖檔大小、類型
			$src_size   = getImageSize($this->src_full);
			
			$this->src_width	= $src_size[0];
			$this->src_height	= $src_size[1];
			$this->src_type		= $src_size["mime"];
			
			if ($in_dst_x > 0 && $in_dst_y > 0 && $this->dst_width > 0 && $this->dst_height > 0){
				$this->do_image(TRUE);
				return TRUE;
			}else{
				return FALSE;
			}
		}else{
			ImageDestroy($this->src_img);
			ImageDestroy($this->dst_img);
			app_die("來源檔案不存在？");
			return FALSE;
		}
	}
}
?>